﻿//SmartExtensionInfoHelper.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Smart
{
	using System;

	using StClientLib;

	using StockSharp.BusinessEntities;

	/// <summary>
	/// Вспомагательный класс, который используется для доступа к специфичной SmartCOM информации через <see cref="IExtendableEntity.ExtensionInfo"/>.
	/// </summary>
	public static class SmartExtensionInfoHelper
	{
		#region SecurityTotalVolume

		/// <summary>
		/// Сумарный объем за текущую торговую сессию.
		/// </summary>
		private const string _securityTotalVolume = "SecurityTotalVolume";

		internal static void SetTotalVolume(this Security security, decimal value)
		{
			security.AddValue(_securityTotalVolume, value);
		}

		/// <summary>
		/// Получить сумарный объем за текущую торговую сессию для инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Сумарный объем за текущую торговую сессию. Если объем отсутствует, то будет возвращено null.</returns>
		public static decimal? GetTotalVolume(this Security security)
		{
			return security.GetValue<decimal?>(_securityTotalVolume);
		}

		#endregion

		#region SecuritySmartId

		/// <summary>
		/// Уникальный идентификатор инструмента системы SmartCOM.
		/// </summary>
		private const string _securitySmartId = "SecuritySmartId";

		internal static void SetSmartId(this Security security, string value)
		{
			security.AddValue(_securitySmartId, value);
		}

		/// <summary>
		/// Получить уникальный идентификатор инструмента системы SmartCOM.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Уникальный идентификатор инструмента системы SmartCOM. Если идентификатор отсутствует, то будет возвращено null.</returns>
		public static string GetSmartId(this Security security)
		{
			return security.GetValue<string>(_securitySmartId);
		}

		#endregion

		#region SecurityBoard

		/// <summary>
		/// Название площадки инструмента в системе SmartCOM.
		/// </summary>
		private const string _securityBoard = "SecurityBoard";

		internal static void SetBoard(this Security security, string value)
		{
			security.AddValue(_securityBoard, value);
		}

		/// <summary>
		/// Получить название площадки инструмента в системе SmartCOM.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Название площадки инструмента в системе SmartCOM. Если площадка отсутствует, то будет возвращено null.</returns>
		public static string GetBoard(this Security security)
		{
			return security.GetValue<string>(_securityBoard);
		}

		#endregion

		#region SecurityDaysBeforeExpiry

		/// <summary>
		/// Дней до экспирации.
		/// </summary>
		private const string _securityDaysBeforeExpiry = "SecurityDaysBeforeExpiry";

		internal static void SetDaysBeforeExpiry(this Security security, decimal value)
		{
			security.AddValue(_securityDaysBeforeExpiry, value);
		}

		/// <summary>
		/// Получить количество дней до экспирации для инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Дней до экспирации. Если информация отсутствует, то будет возвращено null.</returns>
		public static decimal? GetDaysBeforeExpiry(this Security security)
		{
			return security.GetValue<decimal?>(_securityDaysBeforeExpiry);
		}

		#endregion

		#region SecurityOptionsMargin

		/// <summary>
		/// Гарантийное обеспечение продажи опционов.
		/// </summary>
		private const string _securityOptionsMargin = "SecurityOptionsMargin";

		internal static void SetOptionsMargin(this Security security, decimal value)
		{
			security.AddValue(_securityOptionsMargin, value);
		}

		/// <summary>
		/// Получить гарантийное обеспечение продажи опционов для инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Гарантийное обеспечение продажи опционов. Если информация отсутствует, то будет возвращено null.</returns>
		public static decimal? GetOptionsMargin(this Security security)
		{
			return security.GetValue<decimal?>(_securityOptionsMargin);
		}

		#endregion

		#region SecurityOptionsSyntheticMargin

		/// <summary>
		/// Гарантийное обеспечение по синтетическим позициям.
		/// </summary>
		private const string _securityOptionsSyntheticMargin = "SecurityOptionsSyntheticMargin";

		internal static void SetOptionsSyntheticMargin(this Security security, decimal value)
		{
			security.AddValue(_securityOptionsSyntheticMargin, value);
		}

		/// <summary>
		/// Получить гарантийное обеспечение по синтетическим позициям для инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Гарантийное обеспечение по синтетическим позициям. Если информация отсутствует, то будет возвращено null.</returns>
		public static decimal? GetOptionsSyntheticMargin(this Security security)
		{
			return security.GetValue<decimal?>(_securityOptionsSyntheticMargin);
		}

		#endregion

		#region OrderSmartId

		/// <summary>
		/// Уникальный идентификатор заявки системы SmartCOM.
		/// </summary>
		private const string _orderSmartId = "OrderSmartId";

		internal static void SetSmartId(this Order order, string value)
		{
			order.AddValue(_orderSmartId, value);
		}

		/// <summary>
		/// Получить уникальный идентификатор заявки системы SmartCOM.
		/// </summary>
		/// <param name="order">Заявка.</param>
		/// <returns>Уникальный идентификатор заявки системы SmartCOM. Если идентификатор отсутствует, то будет возвращено null.</returns>
		public static string GetSmartId(this Order order)
		{
			return order.GetValue<string>(_orderSmartId);
		}

		#endregion

		#region OrderSmartStatus

		/// <summary>
		/// Состояние заявки в системе SmartCOM.
		/// </summary>
		private const string _orderSmartStatus = "OrderSmartStatus";

		internal static void SetSmartStatus(this Order order, int value)
		{
			order.AddValue(_orderSmartStatus, value);
		}

		/// <summary>
		/// Получить SmartCOM статус заявки.
		/// </summary>
		/// <param name="order">Заявка.</param>
		/// <returns>SmartCOM статус заявки. Если статус отсутствует, то будет возвращено null.</returns>
		public static int? GetSmartStatus(this Order order)
		{
			return order.GetValue<int?>(_orderSmartStatus);
		}

		#endregion

		#region PortfolioExchange

		/// <summary>
		/// Название площадки.
		/// </summary>
		private const string _portfolioExchange = "PortfolioExchange";

		internal static void SetExchange(this Portfolio portfolio, string value)
		{
			portfolio.AddValue(_portfolioExchange, value);
		}

		/// <summary>
		/// Получить SmartCOM название биржи из портфеля.
		/// </summary>
		/// <param name="portfolio">Портфель.</param>
		/// <returns>Название биржи. Если биржа отсутствует, то будет возвращено null.</returns>
		public static string GetExchange(this Portfolio portfolio)
		{
			return portfolio.GetValue<string>(_portfolioExchange);
		}

		#endregion

		#region PortfolioStatus

		/// <summary>
		/// Статус портфеля.
		/// </summary>
		private const string _portfolioStatus = "PortfolioExchange";

		internal static void SetSmartStatus(this Portfolio portfolio, StPortfolioStatus value)
		{
			portfolio.AddValue(_portfolioStatus, value);
		}

		/// <summary>
		/// Получить SmartCOM статус портфеля.
		/// </summary>
		/// <param name="portfolio">Портфель.</param>
		/// <returns>Статус портфеля. Если статус отсутствует, то будет возвращено null.</returns>
		[CLSCompliant(false)]
		public static StPortfolioStatus GetSmartStatus(this Portfolio portfolio)
		{
			return portfolio.GetValue<StPortfolioStatus>(_portfolioStatus);
		}

		#endregion
	}
}
